Aim
I aim to explore how climate change affects endangered
species throughout the world. I am interested in studying how
trends in global warming, specifically annual surface
temperature change, impact endangered species. I plan to
compare yearly climate change trends with the number of
endangered species on the Red List from 1996 to 2022. Hsiung
and Sunstein (2007) mention that the current effects of climate change
have already impacted animal life substantially (p. 1696). On a more
governmental approach to this issue, Rhul (2008) explores what actions
the US Fish and Wildlife Service (FWS) should take to support the
Endangered Species Act (ESA) (p. 13). Unfortunately, as of 2019, agency
plans remained inadequate in relation to conservation of US endangered
species according to Delach, Caldas, Edson, et al. (p. 999). I will also
perform a study of the correlation between annual surface
temperature change per country with the top ten countries with the most
endangered species (as of 2019).
General Question of Investigation
How does climate change impact the number of endangered
species?
Scope and System
The scope of the analysis will be conducted globally by studying
global climate change patterns as well as globally threatened species.
The system will examine the interactions between annual changes in
surface temperature and number of endangered species. The project will
primarily focus on climate change and the number of endangered species
on the Red List from 1996 to 2022 per year, as well as how surface
temperature changes in each country affect the number of endangered
species in the ten countries with the most endangered species as of
2019.
Methods
Data was collected from existing datasets found on the Internet. Data
has been found on the IMF climate
change dashboard for annual surface temperature change from 1961 to
2022 per country. Endangered species data (“Number
of endangered species on the Red List from 1996 to 2022”) has been
collected by the Statista Research Department to examine the
relationship between climate change and the number of endangered
species. These data sets were joined on the basis of year. The figures
in the project displayed global warming trends as well as their
relationship with the number of endangered species on the Red List.
Using the same dataset for annual surface temperature change as well as
the dataset “Countries
with the most endangered species 2019,” a study of the correlation
between surface temperature change per country and the number of
endangered species per country was able to be conducted. These datasets
were joined on the basis of country to compare the relationship between
climate change trends and the number of endangered species per country
for ten countries. In order to view the relationship between countries
and the number of endangered species on a map, the “Countries
geographic coordinates” dataset was used to obtain the latitude and
longitude values for each country.
Results

This first graph displays annual surface temperature changes per year
in relation to a baseline climatology conducted for the years 1951 to
1980. Beginning in 1977, the figure demonstrates a general positive
trend such that as the years progress, the average surface temperature
increases.

This figure displays the number of endangered species on the Red List
reported by the International Union for Conservation of Nature and
Natural Resources (IUCN) per year. Based on this graph, it is evident
that there is a positive trend between the total number of endangered
species and year, such that as the years progress, the total number of
species on the Red List increases. Over 40,000 species (4.2108^{4} to be
exact) were on the IUCN Red List in 2022.

This figure breaks down the total number of endangered species on the
Red List per year into kingdoms. It is evident that there is the largest
number of endangered plant species reported per year while fungi &
protists have the fewest reported endangered species (with none reported
before 2003). In 2022 alone, over half of the reported endangered
species were plants!
Joining, by = "Year"

This graph displays the total number of endangered species on the
IUCN Red List from 1996-2022 in relation to the annual surface
temperature change measured with respect to a baseline climatology
conducted from 1951 to 1980. Although the average surface temperature
change fluctuates slightly over the years, there is a general increase
in temperature. This figure illustrates that as the years progress, the
total number of endangered species on the Red List increases, and there
is a general incrase in surface temperature as well.

This figure illustrates an exponential relationship between the total
number of endangered species on the Red List and time. The color of the
points demonstrates that there is a general increase in average surface
temperature over time as well.
Now let’s investigate these trends by country:

This figure displays the number of endangered species reported per
country as of 2019. This figure focuses on the top 10 countries with the
largest numbers of endangered species, making it evident that Mexico has
the most (665 species to be exact). The United States is ranked #6 with
475 endangered species as of 2019.
Map Displaying the Number of Endangered Species per Country
This map illustrates where in the world countries with reported
numbers of endangered species are located. The color of the point
correlates to the total number of endangered species for that particular
country. Mexico has a bright yellow point because it has the highest
reported number of endangered species. Many of the other countries have
less than 100 endangered species, explaining the abundance of purple
points.

This figure makes it evident that European countries have experienced
the greatest surface temperature changes due to the abundance of red
bars. Oceania and South America appear to have less data points, yet
also lesser changes in surface temperature as of 2019. There was no data
for Antarctica.

This map illustrates surface temperature change in 2019 per country
measured with respect to a baseline climatology (conducted from
1951-1980). The scale on the right indicates that the darker the country
is filled in, the higher the change in surface temperature it
experienced in 2019. The labels indicate the number of endangered
species in the top 10 countries with the highest number of reported
endangered species as of 2019. Although Mexico has the most endangered
species, it has not necessarily experienced the greatest change in
surface temperature.
Main Conclusions
The main conclusions demonstrated by the figures above show that the
number of endangered species increases as surface temperatures increase,
although there isn’t necessarily a direct correlation between the two.
The study of these trends will benefit government agencies such as the
World Wildlife Fund, the U.S. Fish and Wildlife Service, and other
agencies interested in the preservation of endangered animal species.
These interactions can be studied more closely in the future by focusing
on a particular geographic area and the types of endangered species
located there. There is no singular solution to global warming, however
in order for certain species to remain existent on Earth, something must
be done to slow climate change.
References
Alves, B. (2023). Countries with the most endangered species 2019.
Statista. Retrieved April 24, 2023, from https://www.statista.com/statistics/1275491/most-endangered-species-by-country/
Delach, A., Caldas, A., Edson, K.M. et al. (2019) Agency plans are
inadequate to conserve US endangered species under climate change.
Nature Climate Change, 9, 999–1004. https://doi.org/10.1038/s41558-019-0620-8
Cohen, E. (n.d.). Countries geographic coordinates. Kaggle. Retrieved
April 26, 2023, from https://www.kaggle.com/datasets/eidanch/counties-geographic-coordinates
Flach, T. (2020). 26 endangered animals we need to save now. CN
Traveller. Retrieved April 29, 2023, from https://www.cntraveller.com/gallery/endangered-animals
Hsiung, W., & Sunstein, C. R. (2007). Climate change and animals.
University of Pennsylvania Law Review, 155(6), 1695-1740.
International Monetary Fund. (2022). Climate Change Data. Climate
Change Indicators Dashboard. Retrieved April 21, 2023, from https://climatedata.imf.org/pages/climatechange-data
Ruhl, J. J. (2008). Climate change and the endangered species act:
building bridges to the no-analog future. Boston University Law Review,
88(1), 1-62.
Statista Research Department. (2022). Species on the Red List up to
2022. Statista. Retrieved April 21, 2023, from https://www.statista.com/statistics/264841/biodiversity-animals-on-the-red-list/
LS0tCnRpdGxlOiAiQW5udWFsIFN1cmZhY2UgVGVtcGVyYXR1cmUgQ2hhbmdlIEVmZmVjdHMgb24gRW5kYW5nZXJlZCBTcGVjaWVzIgphdXRob3I6ICJMdWN5IFNoZXR0ZWwiCmRhdGU6IE1heSA1LCAyMDIzCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazogCiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogMQogICAgdGhlbWU6IGpvdXJuYWwKLS0tCgohW0lVQ04gUmVkIExpc3QgU3RhdHNdKERlc2t0b3AvR0NTLVIvUmVkX0xpc3RfaW1hZ2UucG5nKQoKCiMgQWltCkkgYWltIHRvIGV4cGxvcmUgaG93ICoqY2xpbWF0ZSBjaGFuZ2UgYWZmZWN0cyBlbmRhbmdlcmVkIHNwZWNpZXMqKiB0aHJvdWdob3V0IHRoZSB3b3JsZC4gSSBhbSBpbnRlcmVzdGVkIGluIHN0dWR5aW5nIGhvdyB0cmVuZHMgaW4gZ2xvYmFsIHdhcm1pbmcsIHNwZWNpZmljYWxseSAqKmFubnVhbCBzdXJmYWNlIHRlbXBlcmF0dXJlIGNoYW5nZSoqLCBpbXBhY3QgZW5kYW5nZXJlZCBzcGVjaWVzLiBJIHBsYW4gdG8gKipjb21wYXJlIHllYXJseSBjbGltYXRlIGNoYW5nZSB0cmVuZHMgd2l0aCB0aGUgbnVtYmVyIG9mIGVuZGFuZ2VyZWQgc3BlY2llcyBvbiB0aGUgUmVkIExpc3QgZnJvbSBgciBlc2J5X3RvdGFscyRZZWFyWzFdYCB0byBgciBlc2J5X3RvdGFscyRZZWFyW25yb3coZXNieV90b3RhbHMpXWAuKiogSHNpdW5nIGFuZCBTdW5zdGVpbiAoMjAwNykgbWVudGlvbiB0aGF0IHRoZSBjdXJyZW50IGVmZmVjdHMgb2YgY2xpbWF0ZSBjaGFuZ2UgaGF2ZSBhbHJlYWR5IGltcGFjdGVkIGFuaW1hbCBsaWZlIHN1YnN0YW50aWFsbHkgKHAuIDE2OTYpLiBPbiBhIG1vcmUgZ292ZXJubWVudGFsIGFwcHJvYWNoIHRvIHRoaXMgaXNzdWUsIFJodWwgKDIwMDgpIGV4cGxvcmVzIHdoYXQgYWN0aW9ucyB0aGUgVVMgRmlzaCBhbmQgV2lsZGxpZmUgU2VydmljZSAoRldTKSBzaG91bGQgdGFrZSB0byBzdXBwb3J0IHRoZSBFbmRhbmdlcmVkIFNwZWNpZXMgQWN0IChFU0EpIChwLiAxMykuIFVuZm9ydHVuYXRlbHksIGFzIG9mIDIwMTksIGFnZW5jeSBwbGFucyByZW1haW5lZCBpbmFkZXF1YXRlIGluIHJlbGF0aW9uIHRvIGNvbnNlcnZhdGlvbiBvZiBVUyBlbmRhbmdlcmVkIHNwZWNpZXMgYWNjb3JkaW5nIHRvIERlbGFjaCwgQ2FsZGFzLCBFZHNvbiwgZXQgYWwuIChwLiA5OTkpLiBJIHdpbGwgYWxzbyBwZXJmb3JtIGEgc3R1ZHkgb2YgdGhlICoqY29ycmVsYXRpb24gYmV0d2VlbiBhbm51YWwgc3VyZmFjZSB0ZW1wZXJhdHVyZSBjaGFuZ2UgcGVyIGNvdW50cnkgd2l0aCB0aGUgdG9wIHRlbiBjb3VudHJpZXMgd2l0aCB0aGUgbW9zdCBlbmRhbmdlcmVkIHNwZWNpZXMgKGFzIG9mIDIwMTkpLioqIAoKIyBHZW5lcmFsIFF1ZXN0aW9uIG9mIEludmVzdGlnYXRpb24KPiBfSG93IGRvZXMgY2xpbWF0ZSBjaGFuZ2UgaW1wYWN0IHRoZSBudW1iZXIgb2YgZW5kYW5nZXJlZCBzcGVjaWVzP18gCgojIFNjb3BlIGFuZCBTeXN0ZW0KVGhlIHNjb3BlIG9mIHRoZSBhbmFseXNpcyB3aWxsIGJlIGNvbmR1Y3RlZCBnbG9iYWxseSBieSBzdHVkeWluZyBnbG9iYWwgY2xpbWF0ZSBjaGFuZ2UgcGF0dGVybnMgYXMgd2VsbCBhcyBnbG9iYWxseSB0aHJlYXRlbmVkIHNwZWNpZXMuIFRoZSBzeXN0ZW0gd2lsbCBleGFtaW5lIHRoZSBpbnRlcmFjdGlvbnMgYmV0d2VlbiBhbm51YWwgY2hhbmdlcyBpbiBzdXJmYWNlIHRlbXBlcmF0dXJlIGFuZCBudW1iZXIgb2YgZW5kYW5nZXJlZCBzcGVjaWVzLiBUaGUgcHJvamVjdCB3aWxsIHByaW1hcmlseSBmb2N1cyBvbiBjbGltYXRlIGNoYW5nZSBhbmQgdGhlIG51bWJlciBvZiBlbmRhbmdlcmVkIHNwZWNpZXMgb24gdGhlIFJlZCBMaXN0IGZyb20gYHIgZXNieV90b3RhbHMkWWVhclsxXWAgdG8gYHIgZXNieV90b3RhbHMkWWVhcltucm93KGVzYnlfdG90YWxzKV1gIHBlciB5ZWFyLCBhcyB3ZWxsIGFzIGhvdyBzdXJmYWNlIHRlbXBlcmF0dXJlIGNoYW5nZXMgaW4gZWFjaCBjb3VudHJ5IGFmZmVjdCB0aGUgbnVtYmVyIG9mIGVuZGFuZ2VyZWQgc3BlY2llcyBpbiB0aGUgdGVuIGNvdW50cmllcyB3aXRoIHRoZSBtb3N0IGVuZGFuZ2VyZWQgc3BlY2llcyBhcyBvZiAyMDE5LgoKCiMgTWV0aG9kcwpEYXRhIHdhcyBjb2xsZWN0ZWQgZnJvbSBleGlzdGluZyBkYXRhc2V0cyBmb3VuZCBvbiB0aGUgSW50ZXJuZXQuIERhdGEgaGFzIGJlZW4gZm91bmQgb24gdGhlIFtJTUYgY2xpbWF0ZSBjaGFuZ2UgZGFzaGJvYXJkXShodHRwczovL2NsaW1hdGVkYXRhLmltZi5vcmcvcGFnZXMvY2xpbWF0ZWNoYW5nZS1kYXRhKSBmb3IgYW5udWFsIHN1cmZhY2UgdGVtcGVyYXR1cmUgY2hhbmdlIGZyb20gMTk2MSB0byAyMDIyIHBlciBjb3VudHJ5LiBFbmRhbmdlcmVkIHNwZWNpZXMgZGF0YSAo4oCcW051bWJlciBvZiBlbmRhbmdlcmVkIHNwZWNpZXMgb24gdGhlIFJlZCBMaXN0IGZyb20gMTk5NiB0byAyMDIyXShodHRwczovL3d3dy5zdGF0aXN0YS5jb20vc3RhdGlzdGljcy8yNjQ4NDEvYmlvZGl2ZXJzaXR5LWFuaW1hbHMtb24tdGhlLXJlZC1saXN0LykiKSBoYXMgYmVlbiBjb2xsZWN0ZWQgYnkgdGhlIFN0YXRpc3RhIFJlc2VhcmNoIERlcGFydG1lbnQgdG8gZXhhbWluZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gY2xpbWF0ZSBjaGFuZ2UgYW5kIHRoZSBudW1iZXIgb2YgZW5kYW5nZXJlZCBzcGVjaWVzLiBUaGVzZSBkYXRhIHNldHMgd2VyZSBqb2luZWQgb24gdGhlIGJhc2lzIG9mIHllYXIuIFRoZSBmaWd1cmVzIGluIHRoZSBwcm9qZWN0IGRpc3BsYXllZCBnbG9iYWwgd2FybWluZyB0cmVuZHMgYXMgd2VsbCBhcyB0aGVpciByZWxhdGlvbnNoaXAgd2l0aCB0aGUgbnVtYmVyIG9mIGVuZGFuZ2VyZWQgc3BlY2llcyBvbiB0aGUgUmVkIExpc3QuIFVzaW5nIHRoZSBzYW1lIGRhdGFzZXQgZm9yIGFubnVhbCBzdXJmYWNlIHRlbXBlcmF0dXJlIGNoYW5nZSBhcyB3ZWxsIGFzIHRoZSBkYXRhc2V0IOKAnFtDb3VudHJpZXMgd2l0aCB0aGUgbW9zdCBlbmRhbmdlcmVkIHNwZWNpZXMgMjAxOV0oaHR0cHM6Ly93d3cuc3RhdGlzdGEuY29tL3N0YXRpc3RpY3MvMTI3NTQ5MS9tb3N0LWVuZGFuZ2VyZWQtc3BlY2llcy1ieS1jb3VudHJ5Lyks4oCdIGEgc3R1ZHkgb2YgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gc3VyZmFjZSB0ZW1wZXJhdHVyZSBjaGFuZ2UgcGVyIGNvdW50cnkgYW5kIHRoZSBudW1iZXIgb2YgZW5kYW5nZXJlZCBzcGVjaWVzIHBlciBjb3VudHJ5IHdhcyBhYmxlIHRvIGJlIGNvbmR1Y3RlZC4gVGhlc2UgZGF0YXNldHMgd2VyZSBqb2luZWQgb24gdGhlIGJhc2lzIG9mIGNvdW50cnkgdG8gY29tcGFyZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gY2xpbWF0ZSBjaGFuZ2UgdHJlbmRzIGFuZCB0aGUgbnVtYmVyIG9mIGVuZGFuZ2VyZWQgc3BlY2llcyBwZXIgY291bnRyeSBmb3IgdGVuIGNvdW50cmllcy4gSW4gb3JkZXIgdG8gdmlldyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gY291bnRyaWVzIGFuZCB0aGUgbnVtYmVyIG9mIGVuZGFuZ2VyZWQgc3BlY2llcyBvbiBhIG1hcCwgdGhlICJbQ291bnRyaWVzIGdlb2dyYXBoaWMgY29vcmRpbmF0ZXNdKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvZWlkYW5jaC9jb3VudGllcy1nZW9ncmFwaGljLWNvb3JkaW5hdGVzKSIgZGF0YXNldCB3YXMgdXNlZCB0byBvYnRhaW4gdGhlIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgdmFsdWVzIGZvciBlYWNoIGNvdW50cnkuIAoKIyBSZXN1bHRzCgpgYGB7ciBsb2FkIHBhY2thZ2VzLCBpbmNsdWRlID0gRkFMU0V9CmxpYnJhcnkoZm9yY2F0cykKbGlicmFyeShtYXB2aWV3KQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeSh2aXJpZGlzKQpsaWJyYXJ5KHNmKQpsaWJyYXJ5KHJuYXR1cmFsZWFydGgpCmxpYnJhcnkocm5hdHVyYWxlYXJ0aGRhdGEpCmBgYAoKCmBgYHtyIGxvYWQgZGF0YSwgaW5jbHVkZSA9IEZBTFNFfQpzdXJmYWNlX3RlbXAgPC0gcmVhZF9jc3YoIi9Vc2Vycy9sdWN5c2hldHRlbC9EZXNrdG9wL0dDUy1SL0FubnVhbF9TdXJmYWNlX1RlbXBlcmF0dXJlX0NoYW5nZS5jc3YiKQplbmRhbmdlcmVkX3NwZWNpZXNfYnlfeWVhciA8LSByZWFkX2NzdigiL1VzZXJzL2x1Y3lzaGV0dGVsL0Rlc2t0b3AvR0NTLVIvRW5kYW5nZXJlZF9TcGVjaWVzX1llYXIuY3N2IikKY291bnRyeV9lbmRhbmdfc3BlY2llcyA8LSByZWFkX2NzdigiL1VzZXJzL2x1Y3lzaGV0dGVsL0Rlc2t0b3AvR0NTLVIvQW5pbWFsX0NvdW50cnlfMjAxOS5jc3YiKQpjb3VudHJpZXMgPC0gcmVhZF9jc3YoIi9Vc2Vycy9sdWN5c2hldHRlbC9EZXNrdG9wL0dDUy1SL2NvdW50cmllcy5jc3YiKQpgYGAKCmBgYHtyIFllYXJseSBBdmcgVGVtcGVyYXR1cmVzLCBpbmNsdWRlID0gRkFMU0V9CgojU2VsZWN0IHllYXJzIGZyb20gc3VyZmFjZSB0ZW1wZXJhdHVyZSBkYXRhIAp5ZWFyX2NvbCA8LSBzZWxlY3Qoc3VyZmFjZV90ZW1wLCBzdGFydHNfd2l0aCgnRicpKQoKI0NhbGN1bGF0ZSBhdmVyYWdlIHRlbXBlcmF0dXJlIGluY3JlYXNlIHBlciB5ZWFyCnllYXJseV9hdmdfdGVtcCA8LSB5ZWFyX2NvbCAlPiUKICBzdW1tYXJpc2UoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpLCBtZWFuLCBuYS5ybSA9IFRSVUUpKSAlPiUKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gRjE5NjE6RjIwMjIsIAogICAgbmFtZXNfdG8gPSAieWVhciIsIAogICAgdmFsdWVzX3RvID0gImF2Z190ZW1wIikKYGBgCgoKYGBge3IgRGlzcGxheSBBbm51YWwgU3VyZmFjZSBUZW1wZXJhdHVyZSBDaGFuZ2VzLCBlY2hvID0gRkFMU0V9CgojQ3JlYXRlIGdyYXBoIGRpc3BsYXlpbmcgYW5udWFsIHN1cmZhY2UgdGVtcGVyYXR1cmUgY2hhbmdlcyBpbiByZWxhdGlvbiB0byBhIGJhc2VsaW5lIGNsaW1hdG9sb2d5IApnZ3Bsb3QoZGF0YSA9IHllYXJseV9hdmdfdGVtcCkgKyAKICBnZW9tX2JhcihtYXBwaW5nID0gYWVzKHggPSB5ZWFyLCB5ID0gYXZnX3RlbXAsIGZpbGwgPSBhdmdfdGVtcCksIHN0YXQgPSAiaWRlbnRpdHkiKSArIAogIGxhYnMoeCA9ICJZZWFyIiwgeSA9ICJBdmVyYWdlIENoYW5nZSBpbiBTdXJmYWNlIFRlbXBlcmF0dXJlICjCsEMpIiwgdGl0bGUgPSAiQW5udWFsIG1lYW4gc3VyZmFjZSB0ZW1wZXJhdHVyZSBjaGFuZ2Vcbm1lYXN1cmVkIHdpdGggcmVzcGVjdCB0byBhIGJhc2VsaW5lIGNsaW1hdG9sb2d5LFxuY29ycmVzcG9uZGluZyB0byB0aGUgeWVhcnMgMTk1MS0xOTgwIikgKwogIHRoZW1lX2RhcmsoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2NSwgaGp1c3QgPTEsIHNpemUgPSA2LjUpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTUsIGZhY2U9ImJvbGQiLCAgaGp1c3QgPSAwLjUpKSArCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKGxvdz0ieWVsbG93IiwgaGlnaCA9ICJyZWQiLCBuYW1lID0gIkF2ZXJhZ2VcblRlbXBlcmF0dXJlXG5DaGFuZ2UgKMKwQykiKSArCiAgc2NhbGVfeF9kaXNjcmV0ZSgiWWVhciIsIGxhYmVscyA9IHN1YnN0cih5ZWFybHlfYXZnX3RlbXAkeWVhciwgMiw1KSkKYGBgCgpUaGlzIGZpcnN0IGdyYXBoIGRpc3BsYXlzIGFubnVhbCBzdXJmYWNlIHRlbXBlcmF0dXJlIGNoYW5nZXMgcGVyIHllYXIgaW4gcmVsYXRpb24gdG8gYSBiYXNlbGluZSBjbGltYXRvbG9neSBjb25kdWN0ZWQgZm9yIHRoZSB5ZWFycyAxOTUxIHRvIDE5ODAuIEJlZ2lubmluZyBpbiAxOTc3LCB0aGUgZmlndXJlIGRlbW9uc3RyYXRlcyBhIGdlbmVyYWwgcG9zaXRpdmUgdHJlbmQgc3VjaCB0aGF0IGFzIHRoZSB5ZWFycyBwcm9ncmVzcywgdGhlIGF2ZXJhZ2Ugc3VyZmFjZSB0ZW1wZXJhdHVyZSBpbmNyZWFzZXMuCgpgYGB7ciBFbmRhbmdlcmVkIFNwZWNpZXMgQnkgWWVhciwgZWNobyA9IEZBTFNFfQoKI0NyZWF0ZSB0YWJsZSBjb250YWluaW5nIGp1c3QgdGhlIG51bWJlcnMgb2YgZW5kYW5nZXJlZCBzcGVjaWVzIHBlciBraW5nZG9tCmVuZGFuZ19zcGVjIDwtIHNlbGVjdChlbmRhbmdlcmVkX3NwZWNpZXNfYnlfeWVhciwgLVllYXIpCgojQ2FsY3VsYXRlIHRvdGFsIG51bWJlciBvZiBlbmRhbmdlcmVkIHNwZWNpZXMgcGVyIHllYXIgKHJvdykgCmVzYnlfd2l0aF90b3RhbHMgPC0gZW5kYW5nZXJlZF9zcGVjaWVzX2J5X3llYXIgJT4lIAogIG11dGF0ZSh0b3RhbCA9IHJvd1N1bXMoZW5kYW5nX3NwZWMsIG5hLnJtPVRSVUUpKQoKI0Rpc3BsYXkgZ3JhcGggb2YgdGhlIHRvdGFsIG51bWJlciBvZiByZXBvcnRlZCBlbmRhbmdlcmVkIHNwZWNpZXMgcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBlc2J5X3dpdGhfdG90YWxzKSArIAogIGdlb21fYmFyKG1hcHBpbmcgPSBhZXMoeCA9IFllYXIsIHkgPSB0b3RhbCwgZmlsbCA9IHRvdGFsKSwgc3RhdCA9ICJpZGVudGl0eSIpICsgCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlRvdGFsIE51bWJlciBvZiBFbmRhbmdlcmVkIFNwZWNpZXMiLCB0aXRsZSA9ICJUb3RhbCBOdW1iZXIgb2YgRW5kYW5nZXJlZCBTcGVjaWVzIG9uIHRoZSBJVUNOIFJlZCBMaXN0XG5wZXIgWWVhciBmcm9tIDE5OTYtMjAyMiIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArIHRoZW1lX2RhcmsoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPTEpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTUsIGZhY2U9ImJvbGQiLCBoanVzdCA9IDAuNSkpICsKICBnZW9tX3RleHQoYWVzKHggPSBZZWFyLCB5ID0gdG90YWwtMTAwMCwgbGFiZWwgPSB0b3RhbCksIHNpemUgPSAxLjUsIGNvbG9yID0gImdyZXkiKQoKYGBgCgpUaGlzIGZpZ3VyZSBkaXNwbGF5cyB0aGUgbnVtYmVyIG9mIGVuZGFuZ2VyZWQgc3BlY2llcyBvbiB0aGUgUmVkIExpc3QgcmVwb3J0ZWQgYnkgdGhlIEludGVybmF0aW9uYWwgVW5pb24gZm9yIENvbnNlcnZhdGlvbiBvZiBOYXR1cmUgYW5kIE5hdHVyYWwgUmVzb3VyY2VzIChJVUNOKSBwZXIgeWVhci4gQmFzZWQgb24gdGhpcyBncmFwaCwgaXQgaXMgZXZpZGVudCB0aGF0IHRoZXJlIGlzIGEgcG9zaXRpdmUgdHJlbmQgYmV0d2VlbiB0aGUgdG90YWwgbnVtYmVyIG9mIGVuZGFuZ2VyZWQgc3BlY2llcyBhbmQgeWVhciwgc3VjaCB0aGF0IGFzIHRoZSB5ZWFycyBwcm9ncmVzcywgdGhlIHRvdGFsIG51bWJlciBvZiBzcGVjaWVzIG9uIHRoZSBSZWQgTGlzdCBpbmNyZWFzZXMuIE92ZXIgNDAsMDAwIHNwZWNpZXMgKGByIGVzYnlfd2l0aF90b3RhbHMkdG90YWxbbnJvdyhlc2J5X3dpdGhfdG90YWxzKV1gIHRvIGJlIGV4YWN0KSB3ZXJlIG9uIHRoZSBJVUNOIFJlZCBMaXN0IGluIDIwMjIuICAgCgpgYGB7ciBEaXNwbGF5IEVuZGFuZ2VyZWQgU3BlY2llcyBieSBLaW5nZG9tLCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KCiNDcmVhdGUgdGFibGUgdG8gZGlzcGxheSB0aGUgdG90YWwgbnVtYmVyIG9mIGVuZGFuZ2VyZWQgc3BlY2llcyBwZXIga2luZ2RvbSBwZXIgeWVhcgpraW5nZG9tcyA8LSBlc2J5X3dpdGhfdG90YWxzICU+JQogIHBpdm90X2xvbmdlcigKICAgIGNvbHMgPSBWZXJ0ZWJyYXRlczpgRnVuZ2kgJiBQcm90aXN0c2AsIAogICAgbmFtZXNfdG8gPSAia2luZ2RvbSIsIAogICAgdmFsdWVzX3RvID0gImFtb3VudCIpCgoKI0Rpc3BsYXkgdGhlIG51bWJlciBvZiBlbmRhbmdlcmVkIHNwZWNpZXMgcGVyIGtpbmdkb20gcGVyIHllYXIKZ2dwbG90KGRhdGEgPSBraW5nZG9tcywgYWVzKHggPSBZZWFyLCB5ID0gYW1vdW50LCBmaWxsID0ga2luZ2RvbSkpICsgCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIk51bWJlciBvZiBFbmRhbmdlcmVkIFNwZWNpZXMiLCB0aXRsZSA9ICJOdW1iZXIgb2YgRW5kYW5nZXJlZCBTcGVjaWVzIG9uIHRoZSBJVUNOIFJlZCBMaXN0XG5wZXIgS2luZ2RvbSBwZXIgWWVhciBmcm9tIDE5OTYtMjAyMiIpICsKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lX2RhcmsoKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE1LCBmYWNlPSJib2xkIiwgaGp1c3QgPSAwLjUpKQoKYGBgCgpUaGlzIGZpZ3VyZSBicmVha3MgZG93biB0aGUgdG90YWwgbnVtYmVyIG9mIGVuZGFuZ2VyZWQgc3BlY2llcyBvbiB0aGUgUmVkIExpc3QgcGVyIHllYXIgaW50byBraW5nZG9tcy4gSXQgaXMgZXZpZGVudCB0aGF0IHRoZXJlIGlzIHRoZSBsYXJnZXN0IG51bWJlciBvZiBlbmRhbmdlcmVkIHBsYW50IHNwZWNpZXMgcmVwb3J0ZWQgcGVyIHllYXIgd2hpbGUgZnVuZ2kgJiBwcm90aXN0cyBoYXZlIHRoZSBmZXdlc3QgcmVwb3J0ZWQgZW5kYW5nZXJlZCBzcGVjaWVzICh3aXRoIG5vbmUgcmVwb3J0ZWQgYmVmb3JlIDIwMDMpLiBJbiAyMDIyIGFsb25lLCBvdmVyIGhhbGYgb2YgdGhlIHJlcG9ydGVkIGVuZGFuZ2VyZWQgc3BlY2llcyB3ZXJlIHBsYW50cyEKCgpgYGB7ciBDb21iaW5lIEVuZGFuZ2VyZWQgU3BlY2llcyBEYXRhIHdpdGggU3VyZmFjZSBUZW1wLiBDaGFuZ2UsIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQoKI0NyZWF0ZSB0YWJsZSB3aXRoIGVuZGFuZ2VyZWQgc3BlY2llcyBkYXRhIGZvciAxOTk2LzE5OTggc2VwYXJhdGVkIGludG8gdGhlaXIgb3duIHJvd3MKZXNieV90b3RhbHMgPC0gZXNieV93aXRoX3RvdGFscyAlPiUKICBzZXBhcmF0ZShZZWFyLCBpbnRvID0gIlllYXIiLCBzZXAgPSAiLyIpICU+JQogIGFkZF9yb3coWWVhciA9ICcxOTk4JywgVmVydGVicmF0ZXMgPSAzMzE0LCBJbnZlcnRlYnJhdGVzID0gMTg5MSwgUGxhbnRzID0gNTMyOCwgdG90YWwgPSAxMDUzMywgLmFmdGVyID0gMSkKCiNDcmVhdGUgdGliYmxlIG9mIHllYXJseSBhdmVyYWdlIHN1cmZhY2UgdGVtcGVyYXR1cmUgY2hhbmdlCmF2Z190ZW1wX2FkanVzdGVkIDwtIHRpYmJsZShZZWFyID0gMTk2MToyMDIyLCBhdmdfdGVtcCA9IHllYXJseV9hdmdfdGVtcCRhdmdfdGVtcCkKCiNDaGFuZ2UgWWVhciBjb2x1bW4gdHlwZSB0byBpbnRlZ2VyIHNvIGl0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgeWVhciBjb2x1bW4gaW4gYXZnX3RlbXBfYWRqdXN0ZWQKZXNieV90b3RhbHMgPC0gdHJhbnNmb3JtKGVzYnlfdG90YWxzLCBZZWFyID0gYXMubnVtZXJpYyhZZWFyKSkKCiNKb2luIHRlbXBlcmF0dXJlIGNoYW5nZSBkYXRhIHdpdGggZW5kYW5nZXJlZCBzcGVjaWVzIGRhdGEKam9pbmVkX3NwZWNpZXNfdGVtcCA8LSByaWdodF9qb2luKGF2Z190ZW1wX2FkanVzdGVkLCBlc2J5X3RvdGFscykKCiNEaXNwbGF5IGVuZGFuZ2VyZWQgc3BlY2llcyBkYXRhIGluIHJlbGF0aW9uIHRvIHllYXJseSBzdXJmYWNlIHRlbXBlcmF0dXJlIGNoYW5nZQpnZ3Bsb3QoZGF0YSA9IGpvaW5lZF9zcGVjaWVzX3RlbXApICsgCiAgZ2VvbV9iYXIobWFwcGluZyA9IGFlcyh4ID0gWWVhciwgeSA9IHRvdGFsLCBmaWxsID0gYXZnX3RlbXApLCBzdGF0ID0gImlkZW50aXR5IikgKyAKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiVG90YWwgTnVtYmVyIG9mIEVuZGFuZ2VyZWQgU3BlY2llcyIsIHRpdGxlID0gIlRvdGFsIG51bWJlciBvZiBlbmRhbmdlcmVkIHNwZWNpZXMgb24gdGhlIElVQ04gUmVkIExpc3RcbmluIHJlbGF0aW9uIHRvIHRoZSBhbm51YWwgbWVhbiBzdXJmYWNlIHRlbXBlcmF0dXJlIGNoYW5nZVxuKEJhciBHcmFwaCkiKSArCiAgdGhlbWVfZGFyaygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDMwLCBoanVzdCA9MSksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xNSwgZmFjZT0iYm9sZCIsICBoanVzdCA9IDAuNSkpICsKICBzY2FsZV9maWxsX2NvbnRpbnVvdXMobG93PSJ5ZWxsb3ciLCBoaWdoID0gInJlZCIsIG5hbWUgPSAiQXZlcmFnZVxuVGVtcGVyYXR1cmVcbkNoYW5nZSAowrBDKSIpCgpgYGAKVGhpcyBncmFwaCBkaXNwbGF5cyB0aGUgdG90YWwgbnVtYmVyIG9mIGVuZGFuZ2VyZWQgc3BlY2llcyBvbiB0aGUgSVVDTiBSZWQgTGlzdCBmcm9tIDE5OTYtMjAyMiBpbiByZWxhdGlvbiB0byB0aGUgYW5udWFsIHN1cmZhY2UgdGVtcGVyYXR1cmUgY2hhbmdlIG1lYXN1cmVkIHdpdGggcmVzcGVjdCB0byBhIGJhc2VsaW5lIGNsaW1hdG9sb2d5IGNvbmR1Y3RlZCBmcm9tIDE5NTEgdG8gMTk4MC4gQWx0aG91Z2ggdGhlIGF2ZXJhZ2Ugc3VyZmFjZSB0ZW1wZXJhdHVyZSBjaGFuZ2UgZmx1Y3R1YXRlcyBzbGlnaHRseSBvdmVyIHRoZSB5ZWFycywgdGhlcmUgaXMgYSBnZW5lcmFsIGluY3JlYXNlIGluIHRlbXBlcmF0dXJlLiBUaGlzIGZpZ3VyZSBpbGx1c3RyYXRlcyB0aGF0IGFzIHRoZSB5ZWFycyBwcm9ncmVzcywgdGhlIHRvdGFsIG51bWJlciBvZiBlbmRhbmdlcmVkIHNwZWNpZXMgb24gdGhlIFJlZCBMaXN0IGluY3JlYXNlcywgYW5kIHRoZXJlIGlzIGEgZ2VuZXJhbCBpbmNyYXNlIGluIHN1cmZhY2UgdGVtcGVyYXR1cmUgYXMgd2VsbC4KCmBgYHtyIFNjYXR0ZXIgcGxvdCBkaXNwbGF5aW5nIGVuZGFuZ2VyZWQgc3BlY2llcyBhbmQgc3VyZmFjZSB0ZW1wZXJhdHVyZSBjaGFuZ2UgZGF0YSwgZWNobz0gRkFMU0UsIHdhcm5pbmc9RkFMU0V9CgojR2VvbV9wb2ludCBvZiBlbmRhbmdlcmVkIHNwZWNpZXMgYW5kIHN1cmZhY2UgdGVtcGVyYXR1cmUKZ2dwbG90KGRhdGEgPSBqb2luZWRfc3BlY2llc190ZW1wKSArIAogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gWWVhciwgeSA9IHRvdGFsLCBjb2xvciA9IGF2Z190ZW1wKSkgKyAKICBsYWJzKHggPSAiWWVhciIsIHkgPSAiVG90YWwgTnVtYmVyIG9mIEVuZGFuZ2VyZWQgU3BlY2llcyIsIHRpdGxlID0gIlRvdGFsIG51bWJlciBvZiBlbmRhbmdlcmVkIHNwZWNpZXMgb24gdGhlIElVQ04gUmVkIExpc3RcbmluIHJlbGF0aW9uIHRvIHRoZSBhbm51YWwgbWVhbiBzdXJmYWNlIHRlbXBlcmF0dXJlIGNoYW5nZVxuKFNjYXR0ZXIgUGxvdCkiKSArCiAgdGhlbWVfZGFyaygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDMwLCBoanVzdCA9MSksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xNSwgZmFjZT0iYm9sZCIsICBoanVzdCA9IDAuNSkpICsKICBzY2FsZV9jb2xvcl9jb250aW51b3VzKGxvdz0ieWVsbG93IiwgaGlnaCA9ICJyZWQiLCBuYW1lID0gIkF2ZXJhZ2VcblRlbXBlcmF0dXJlXG5DaGFuZ2UgKMKwQykiKSArIAogIGdlb21fc21vb3RoKG1hcHBpbmcgPSBhZXMoeCA9IFllYXIsIHkgPSB0b3RhbCksIGNvbG9yID0gIndoaXRlIiwgbGluZXdpZHRoID0gMC41KQpgYGAKClRoaXMgZmlndXJlIGlsbHVzdHJhdGVzIGFuIGV4cG9uZW50aWFsIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSB0b3RhbCBudW1iZXIgb2YgZW5kYW5nZXJlZCBzcGVjaWVzIG9uIHRoZSBSZWQgTGlzdCBhbmQgdGltZS4gVGhlIGNvbG9yIG9mIHRoZSBwb2ludHMgZGVtb25zdHJhdGVzIHRoYXQgdGhlcmUgaXMgYSBnZW5lcmFsIGluY3JlYXNlIGluIGF2ZXJhZ2Ugc3VyZmFjZSB0ZW1wZXJhdHVyZSBvdmVyIHRpbWUgYXMgd2VsbC4gCgojIyBfTm93IGxldCdzIGludmVzdGlnYXRlIHRoZXNlIHRyZW5kcyBieSBjb3VudHJ5Ol8KCmBgYHtyIE51bWJlciBvZiBFbmRhbmdlcmVkIFNwZWNpZXMgUGVyIENvdW50cnkgYXMgb2YgMjAxOSwgZWNobyA9IEZBTFNFfQoKI0NyZWF0ZSBkYXRhIGZyYW1lIG9mIHRvcCAxMCBjb3VudHJpZXMgd2l0aCB0aGUgbW9zdCByZXBvcnRlZCBlbmRhbmdlcmVkIHNwZWNpZXMKdG9wXzEwIDwtIGNvdW50cnlfZW5kYW5nX3NwZWNpZXMgJT4lCiAgYXJyYW5nZShkZXNjKFRvdGFsKSkgJT4lCiAgZmlsdGVyKFJhbmsgPCAxMSkgCgojQ3JlYXRlIGdyYXBoIGRpc3BsYXlpbmcgdGhlIHRvdGFsIG51bWJlciBvZiBlbmRhbmdlcmVkIHNwZWNpZXMgcGVyIGNvdW50cnkKZ2dwbG90KGRhdGEgPSB0b3BfMTAsIG1hcHBpbmcgPSBhZXMoeCA9IFRvdGFsLCB5ID0gZmN0X3Jlb3JkZXIoQ291bnRyeSwgVG90YWwpLCBmaWxsID0gVG90YWwpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgCiAgbGFicyh4ID0gIlRvdGFsIE51bWJlciBvZiBFbmRhbmdlcmVkIFNwZWNpZXMiLCB5ID0gIkNvdW50cmllcyB3aXRoIHRoZSBNb3N0IEVuZGFuZ2VyZWQgU3BlY2llcyIsIHRpdGxlID0gIlRvdGFsIE51bWJlciBvZiBFbmRhbmdlcmVkIFNwZWNpZXMgcGVyIENvdW50cnlcbihhcyBvZiAyMDE5KSIpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArIHRoZW1lX2RhcmsoKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE1LCBmYWNlPSJib2xkIiwgaGp1c3QgPSAwLjUpKSArCiAgZ2VvbV90ZXh0KGFlcyh4ID0gVG90YWwtMjAsIGxhYmVsID0gVG90YWwpLCBjb2xvciA9ICJncmF5Iiwgc2l6ZSA9IDMpCmBgYAoKVGhpcyBmaWd1cmUgZGlzcGxheXMgdGhlIG51bWJlciBvZiBlbmRhbmdlcmVkIHNwZWNpZXMgcmVwb3J0ZWQgcGVyIGNvdW50cnkgYXMgb2YgMjAxOS4gVGhpcyBmaWd1cmUgZm9jdXNlcyBvbiB0aGUgdG9wIDEwIGNvdW50cmllcyB3aXRoIHRoZSBsYXJnZXN0IG51bWJlcnMgb2YgZW5kYW5nZXJlZCBzcGVjaWVzLCBtYWtpbmcgaXQgZXZpZGVudCB0aGF0IE1leGljbyBoYXMgdGhlIG1vc3QgKGByIHRvcF8xMCRUb3RhbFsxXWAgc3BlY2llcyB0byBiZSBleGFjdCkuIFRoZSBVbml0ZWQgU3RhdGVzIGlzIHJhbmtlZCAjYHIgdG9wXzEwJFJhbmtbNl1gIHdpdGggYHIgdG9wXzEwJFRvdGFsWzZdYCBlbmRhbmdlcmVkIHNwZWNpZXMgYXMgb2YgMjAxOS4KCiMjIE1hcCBEaXNwbGF5aW5nIHRoZSBOdW1iZXIgb2YgRW5kYW5nZXJlZCBTcGVjaWVzIHBlciBDb3VudHJ5IAoKYGBge3IgTWFwIG9mIEVuZGFuZ2VyZWQgU3BlY2llcyBwZXIgY291bnRyeSBhcyBvZiAyMDE5LCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KCiNBZGQgbGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSBpbmZvcm1hdGlvbiB0byB0aGUgc3VyZmFjZSB0ZW1wZXJhdHVyZSBjaGFuZ2UgZGF0YQpsYXRfbG9uZyA8LSBjb3VudHJpZXMgJT4lCiAgbXV0YXRlKElTTzIgPSBjb3VudHJ5KSAlPiUKICBpbm5lcl9qb2luKHN1cmZhY2VfdGVtcCwgYnkgPSAiSVNPMiIpCgojQWRkIHRoZSBudW1iZXIgb2YgZW5kYW5nZXJlZCBzcGVjaWVzIHRvIHRoZSBwcmV2aW91c2x5IGpvaW5lZCBkYXRhc2V0CmNvdW50cmllc190ZW1wc19zcGVjaWVzIDwtIGxhdF9sb25nICU+JQogIGlubmVyX2pvaW4oY291bnRyeV9lbmRhbmdfc3BlY2llcywgYnkgPSAiQ291bnRyeSIpCgojQ3JlYXRlIG1hcCBkaXNwbGF5aW5nIHRoZSBsb2NhdGlvbnMgb2YgZW5kYW5nZXJlZCBzcGVjaWVzIHdpdGggdGhlIGNvbG9yIG9mIHRoZSBwb2ludCByZXByZXNlbnRpbmcgdGhlIHRvdGFsIG51bWJlcgptYXB2aWV3KGNvdW50cmllc190ZW1wc19zcGVjaWVzLCB4Y29sID0gImxvbmdpdHVkZSIsIHljb2wgPSAibGF0aXR1ZGUiLCB6Y29sID0gIlRvdGFsIiwgY3JzID0gNDMyNiwgZ3JpZCA9IEZBTFNFLCBsYWJlbCA9ICJUb3RhbCIpCgpgYGAKVGhpcyBtYXAgaWxsdXN0cmF0ZXMgd2hlcmUgaW4gdGhlIHdvcmxkIGNvdW50cmllcyB3aXRoIHJlcG9ydGVkIG51bWJlcnMgb2YgZW5kYW5nZXJlZCBzcGVjaWVzIGFyZSBsb2NhdGVkLiBUaGUgY29sb3Igb2YgdGhlIHBvaW50IGNvcnJlbGF0ZXMgdG8gdGhlIHRvdGFsIG51bWJlciBvZiBlbmRhbmdlcmVkIHNwZWNpZXMgZm9yIHRoYXQgcGFydGljdWxhciBjb3VudHJ5LiBgciB0b3BfMTAkQ291bnRyeVsxXWAgaGFzIGEgYnJpZ2h0IHllbGxvdyBwb2ludCBiZWNhdXNlIGl0IGhhcyB0aGUgaGlnaGVzdCByZXBvcnRlZCBudW1iZXIgb2YgZW5kYW5nZXJlZCBzcGVjaWVzLiBNYW55IG9mIHRoZSBvdGhlciBjb3VudHJpZXMgaGF2ZSBsZXNzIHRoYW4gMTAwIGVuZGFuZ2VyZWQgc3BlY2llcywgZXhwbGFpbmluZyB0aGUgYWJ1bmRhbmNlIG9mIHB1cnBsZSBwb2ludHMuCgoKYGBge3IgV29ybGQgVGVtcHMsIGluY2x1ZGUgPSBGQUxTRX0KCiMyMDE5IHN1cmZhY2UgdGVtcGVyYXR1cmUgY2hhbmdlcwp0ZW1wc18yMDE5IDwtIHN1cmZhY2VfdGVtcCAlPiUKICBzZWxlY3QoQ291bnRyeSwgSVNPMywgRjIwMTkpICU+JQogIG11dGF0ZShpc29fYTMgPSBJU08zKQoKI2RhdGEgdG8gY3JlYXRlIHdvcmxkIG1hcAp3b3JsZCA8LSBuZV9jb3VudHJpZXMoc2NhbGUgPSAibGFyZ2UiLCByZXR1cm5jbGFzcyA9ICJzZiIpCgojTWVyZ2UgMjAxOSB0ZW1wZXJhdHVyZSBkYXRhIHdpdGggdGhlIHdvcmxkIG1hcCBkYXRhIHRvIGRpc3BsYXkKbWFwX2RhdGEgPC0gbWVyZ2Uod29ybGQsIHRlbXBzXzIwMTksIGJ5ID0gImlzb19hMyIsIGFsbC54ID0gVFJVRSkKCiNBZGQgJ25hbWUnIGNvbHVtbiB0byB0b3BfMTAgdG8gam9pbiB0aGUgdGFibGVzCnRvcF8xMCA8LSB0b3BfMTAgJT4lCiAgbXV0YXRlKG5hbWVfbG9uZyA9IENvdW50cnkpCgojTWVyZ2UgdGhlIGVuZGFuZ2VyZWQgc3BlY2llcyBwZXIgY291bnRyeSBkYXRhIHdpdGggdGhlIHByZXZpb3VzbHkgbWVyZ2VkIGRhdGEKdG9wXzEwX2Nvb3JkIDwtIG1lcmdlKHRvcF8xMCwgbWFwX2RhdGEsIGJ5ID0gIm5hbWVfbG9uZyIpCmBgYAoKYGBge3IgTGlzdCBDb2xuYW1lcyBmb3IgbWFwX2RhdGEsIGluY2x1ZGUgPSBGQUxTRX0KCiNMaXN0IGNvbHVtbiBuYW1lcyBmb3IgbWFwX2RhdGEgdG8gZW5zdXJlIGNvbnRpbmVudCBkYXRhIGlzIGluY2x1ZGVkIApjb2xuYW1lcyhtYXBfZGF0YSkKCmBgYAoKYGBge3IgRmFjZXQgYnkgY29udGluZW50LCBlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KCmdncGxvdChkYXRhID0gbWFwX2RhdGEpICsgCiAgZ2VvbV9iYXIobWFwcGluZyA9IGFlcyh4ID0gQ291bnRyeSwgeSA9IEYyMDE5LCBmaWxsID0gRjIwMTkpLCBzdGF0ID0gImlkZW50aXR5IikgKyAKICBmYWNldF93cmFwKH4gY29udGluZW50LCBucm93ID0gMikgKwogIGxhYnMoeCA9ICJDb3VudHJ5IiwgeSA9ICJDaGFuZ2UgaW4gU3VyZmFjZSBUZW1wZXJhdHVyZSAowrBDKSIsIHRpdGxlID0gIjIwMTkgU3VyZmFjZSB0ZW1wZXJhdHVyZSBjaGFuZ2UgcGVyIGNvdW50cnlcbm1lYXN1cmVkIHdpdGggcmVzcGVjdCB0byBhIGJhc2VsaW5lIGNsaW1hdG9sb2d5XG4oQmFyIEdyYXBoKSIpKwogIHRoZW1lX2RhcmsoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2NSwgaGp1c3QgPTEsIHNpemUgPSAxKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE1LCBmYWNlPSJib2xkIiwgIGhqdXN0ID0gMC41KSwgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsKICBzY2FsZV9maWxsX2NvbnRpbnVvdXMobG93PSJ5ZWxsb3ciLCBoaWdoID0gInJlZCIsIG5hbWUgPSAiVGVtcGVyYXR1cmVcbkNoYW5nZVxuaW4gMjAxOSAowrBDKSIpCgpgYGAKClRoaXMgZmlndXJlIG1ha2VzIGl0IGV2aWRlbnQgdGhhdCBFdXJvcGVhbiBjb3VudHJpZXMgaGF2ZSBleHBlcmllbmNlZCB0aGUgZ3JlYXRlc3Qgc3VyZmFjZSB0ZW1wZXJhdHVyZSBjaGFuZ2VzIGR1ZSB0byB0aGUgYWJ1bmRhbmNlIG9mIHJlZCBiYXJzLiBPY2VhbmlhIGFuZCBTb3V0aCBBbWVyaWNhIGFwcGVhciB0byBoYXZlIGxlc3MgZGF0YSBwb2ludHMsIHlldCBhbHNvIGxlc3NlciBjaGFuZ2VzIGluIHN1cmZhY2UgdGVtcGVyYXR1cmUgYXMgb2YgMjAxOS4gVGhlcmUgd2FzIG5vIGRhdGEgZm9yIEFudGFyY3RpY2EuCgpgYGB7ciBNYXAgb2Ygc3VyZmFjZSB0ZW1wIGNoYW5nZXMgcGVyIGNvdW50cnksIGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQpnZ3Bsb3QoZGF0YSA9IG1hcF9kYXRhLCBhZXMoZ2VvbWV0cnkgPSBnZW9tZXRyeSkpICsKICBnZW9tX3NmKGFlcyhmaWxsID0gRjIwMTkpKSArCiAgZ2VvbV9zZl9sYWJlbChhZXMobGFiZWwgPSBUb3RhbCksIGRhdGEgPSB0b3BfMTBfY29vcmQsIGxhYmVsLnBhZGRpbmcgPSB1bml0KDAuMSwgImxpbmVzIiksIHNpemUgPSAxLjUpICsKICBsYWJzKHggPSAiICIsIHkgPSAiICIsIHRpdGxlID0gIjIwMTkgU3VyZmFjZSB0ZW1wZXJhdHVyZSBjaGFuZ2UgcGVyIGNvdW50cnlcbm1lYXN1cmVkIHdpdGggcmVzcGVjdCB0byBhIGJhc2VsaW5lIGNsaW1hdG9sb2d5XG4oTWFwKSIpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTUsIGZhY2U9ImJvbGQiLCAgaGp1c3QgPSAwLjUpKSArCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKGxvdz0ieWVsbG93IiwgaGlnaCA9ICJyZWQiLCBuYW1lID0gIlRlbXBlcmF0dXJlXG5DaGFuZ2VcbmluIDIwMTkgKMKwQykiKQpgYGAKClRoaXMgbWFwIGlsbHVzdHJhdGVzIHN1cmZhY2UgdGVtcGVyYXR1cmUgY2hhbmdlIGluIDIwMTkgcGVyIGNvdW50cnkgbWVhc3VyZWQgd2l0aCByZXNwZWN0IHRvIGEgYmFzZWxpbmUgY2xpbWF0b2xvZ3kgKGNvbmR1Y3RlZCBmcm9tIDE5NTEtMTk4MCkuIFRoZSBzY2FsZSBvbiB0aGUgcmlnaHQgaW5kaWNhdGVzIHRoYXQgdGhlIGRhcmtlciB0aGUgY291bnRyeSBpcyBmaWxsZWQgaW4sIHRoZSBoaWdoZXIgdGhlIGNoYW5nZSBpbiBzdXJmYWNlIHRlbXBlcmF0dXJlIGl0IGV4cGVyaWVuY2VkIGluIDIwMTkuIFRoZSBsYWJlbHMgaW5kaWNhdGUgdGhlIG51bWJlciBvZiBlbmRhbmdlcmVkIHNwZWNpZXMgaW4gdGhlIHRvcCAxMCBjb3VudHJpZXMgd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgcmVwb3J0ZWQgZW5kYW5nZXJlZCBzcGVjaWVzIGFzIG9mIDIwMTkuIEFsdGhvdWdoIGByIHRvcF8xMCRDb3VudHJ5WzFdYCBoYXMgdGhlIG1vc3QgZW5kYW5nZXJlZCBzcGVjaWVzLCBpdCBoYXMgbm90IG5lY2Vzc2FyaWx5IGV4cGVyaWVuY2VkIHRoZSBncmVhdGVzdCBjaGFuZ2UgaW4gc3VyZmFjZSB0ZW1wZXJhdHVyZS4gCgojIE1haW4gQ29uY2x1c2lvbnMgClRoZSBtYWluIGNvbmNsdXNpb25zIGRlbW9uc3RyYXRlZCBieSB0aGUgZmlndXJlcyBhYm92ZSBzaG93IHRoYXQgdGhlIG51bWJlciBvZiBlbmRhbmdlcmVkIHNwZWNpZXMgaW5jcmVhc2VzIGFzIHN1cmZhY2UgdGVtcGVyYXR1cmVzIGluY3JlYXNlLCBhbHRob3VnaCB0aGVyZSBpc24ndCBuZWNlc3NhcmlseSBhIGRpcmVjdCBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSB0d28uIFRoZSBzdHVkeSBvZiB0aGVzZSB0cmVuZHMgd2lsbCBiZW5lZml0IGdvdmVybm1lbnQgYWdlbmNpZXMgc3VjaCBhcyB0aGUgV29ybGQgV2lsZGxpZmUgRnVuZCwgdGhlIFUuUy4gRmlzaCBhbmQgV2lsZGxpZmUgU2VydmljZSwgYW5kIG90aGVyIGFnZW5jaWVzIGludGVyZXN0ZWQgaW4gdGhlIHByZXNlcnZhdGlvbiBvZiBlbmRhbmdlcmVkIGFuaW1hbCBzcGVjaWVzLiBUaGVzZSBpbnRlcmFjdGlvbnMgY2FuIGJlIHN0dWRpZWQgbW9yZSBjbG9zZWx5IGluIHRoZSBmdXR1cmUgYnkgZm9jdXNpbmcgb24gYSBwYXJ0aWN1bGFyIGdlb2dyYXBoaWMgYXJlYSBhbmQgdGhlIHR5cGVzIG9mIGVuZGFuZ2VyZWQgc3BlY2llcyBsb2NhdGVkIHRoZXJlLiBUaGVyZSBpcyBubyBzaW5ndWxhciBzb2x1dGlvbiB0byBnbG9iYWwgd2FybWluZywgaG93ZXZlciBpbiBvcmRlciBmb3IgY2VydGFpbiBzcGVjaWVzIHRvIHJlbWFpbiBleGlzdGVudCBvbiBFYXJ0aCwgc29tZXRoaW5nIG11c3QgYmUgZG9uZSB0byBzbG93IGNsaW1hdGUgY2hhbmdlLgoKIVtUZW4gYW5pbWFscyBvbiBUaGUgSVVDTiBSZWQgTGlzdCBvZiBUaHJlYXRlbmVkIFNwZWNpZXNdKERlc2t0b3AvR0NTLVIvZW5kLmpwZykKCiMgUmVmZXJlbmNlcwpBbHZlcywgQi4gKDIwMjMpLiBDb3VudHJpZXMgd2l0aCB0aGUgbW9zdCBlbmRhbmdlcmVkIHNwZWNpZXMgMjAxOS4gU3RhdGlzdGEuIFJldHJpZXZlZCBBcHJpbCAyNCwgMjAyMywgZnJvbSBodHRwczovL3d3dy5zdGF0aXN0YS5jb20vc3RhdGlzdGljcy8xMjc1NDkxL21vc3QtZW5kYW5nZXJlZC1zcGVjaWVzLWJ5LWNvdW50cnkvCgpEZWxhY2gsIEEuLCBDYWxkYXMsIEEuLCBFZHNvbiwgSy5NLiBldCBhbC4gKDIwMTkpIEFnZW5jeSBwbGFucyBhcmUgaW5hZGVxdWF0ZSB0byBjb25zZXJ2ZSBVUyBlbmRhbmdlcmVkIHNwZWNpZXMgdW5kZXIgY2xpbWF0ZSBjaGFuZ2UuIE5hdHVyZSBDbGltYXRlIENoYW5nZSwgOSwgOTk54oCTMTAwNC4gCmh0dHBzOi8vZG9pLm9yZy8xMC4xMDM4L3M0MTU1OC0wMTktMDYyMC04CgpDb2hlbiwgRS4gKG4uZC4pLiBDb3VudHJpZXMgZ2VvZ3JhcGhpYyBjb29yZGluYXRlcy4gS2FnZ2xlLiBSZXRyaWV2ZWQgQXByaWwgMjYsIDIwMjMsIGZyb20gaHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9kYXRhc2V0cy9laWRhbmNoL2NvdW50aWVzLWdlb2dyYXBoaWMtY29vcmRpbmF0ZXMKCkZsYWNoLCBULiAoMjAyMCkuIDI2IGVuZGFuZ2VyZWQgYW5pbWFscyB3ZSBuZWVkIHRvIHNhdmUgbm93LiBDTiBUcmF2ZWxsZXIuIFJldHJpZXZlZCBBcHJpbCAyOSwgMjAyMywgZnJvbSBodHRwczovL3d3dy5jbnRyYXZlbGxlci5jb20vZ2FsbGVyeS9lbmRhbmdlcmVkLWFuaW1hbHMKCkhzaXVuZywgVy4sICYgU3Vuc3RlaW4sIEMuIFIuICgyMDA3KS4gQ2xpbWF0ZSBjaGFuZ2UgYW5kIGFuaW1hbHMuIFVuaXZlcnNpdHkgb2YgUGVubnN5bHZhbmlhIExhdyBSZXZpZXcsIDE1NSg2KSwgMTY5NS0xNzQwLgoKSW50ZXJuYXRpb25hbCBNb25ldGFyeSBGdW5kLiAoMjAyMikuIENsaW1hdGUgQ2hhbmdlIERhdGEuIENsaW1hdGUgQ2hhbmdlIEluZGljYXRvcnMgRGFzaGJvYXJkLiBSZXRyaWV2ZWQgQXByaWwgMjEsIDIwMjMsIGZyb20gaHR0cHM6Ly9jbGltYXRlZGF0YS5pbWYub3JnL3BhZ2VzL2NsaW1hdGVjaGFuZ2UtZGF0YQoKUnVobCwgSi4gSi4gKDIwMDgpLiBDbGltYXRlIGNoYW5nZSBhbmQgdGhlIGVuZGFuZ2VyZWQgc3BlY2llcyBhY3Q6IGJ1aWxkaW5nIGJyaWRnZXMgdG8gdGhlIApuby1hbmFsb2cgZnV0dXJlLiBCb3N0b24gVW5pdmVyc2l0eSBMYXcgUmV2aWV3LCA4OCgxKSwgMS02Mi4gCgpTdGF0aXN0YSBSZXNlYXJjaCBEZXBhcnRtZW50LiAoMjAyMikuIFNwZWNpZXMgb24gdGhlIFJlZCBMaXN0IHVwIHRvIDIwMjIuIFN0YXRpc3RhLiBSZXRyaWV2ZWQgQXByaWwgMjEsIDIwMjMsIGZyb20gaHR0cHM6Ly93d3cuc3RhdGlzdGEuY29tL3N0YXRpc3RpY3MvMjY0ODQxL2Jpb2RpdmVyc2l0eS1hbmltYWxzLW9uLXRoZS1yZWQtbGlzdC8KCgo=